package main

import (
	"fmt"
	"sync"
)

// Singleton 结构体包含一些基本属性
type Singleton struct {
	Data string
	once sync.Once // 用于确保初始化只执行一次
}

// 实例指针，使用原子操作确保线程安全
var instance *Singleton
var instanceMutex sync.Mutex

// GetInstance 获取 Singleton 实例的指针
func GetInstance() *Singleton {
	// 使用原子操作来设置实例指针
	if instance == nil {
		instanceMutex.Lock()
		if instance == nil { // 再次检查，防止多个 goroutine 同时进入
			instance = &Singleton{}
			instance.once.Do(func() {
				// 初始化操作
				instance.Data = "我是数据111"
			})
		}
		instanceMutex.Unlock()
	}
	return instance
}

func main() {
	// 测试代码
	s1 := GetInstance()
	fmt.Println("Instance 1 Data:", s1.Data)

	s2 := GetInstance()
	fmt.Println("Instance 2 Data:", s2.Data)

	// 验证两个实例是否为同一实例
	fmt.Println("两者是否为一个:", s1 == s2)
}
